package com.cmc.cloud.cmclink.doc.rpcservice;

import com.cmc.cloud.cmclink.csm.api.base.dto.req.CompanyNameCastReqVO;
import com.cmc.cloud.cmclink.csm.api.base.dto.resp.CompanyNameCastRespDTO;
import com.cmc.cloud.cmclink.csm.api.base.enums.DataTypeEnum;
import com.cmc.cloud.cmclink.doc.rpcservice.vo.AgentNameBaseVo;
import com.cmc.cloud.cmclink.doc.rpcservice.vo.BkpNameBaseVo;
import com.cmc.cloud.cmclink.doc.vo.vesseloffhiremaintenancevo.VesselOffHireMaintenanceRespVO;

import java.util.List;
import java.util.Map;

/**
 * @author 周贤
 * @date 2025/3/28
 */
public interface CustomerRpcService {
    /**
     * 条件查询
     *
     * @param keyWord
     * @param typeEnum
     * @return
     */
    List<String> addQuery(String keyWord, DataTypeEnum typeEnum);

    /**
     * 填充冗余字段:name
     * 
     * @param list
     */
    void fillName(List<? extends BkpNameBaseVo> list);

    /**
     * 使用函数式编程方式填充公司名称，避免实现FillCompanyName接口
     * @param list 需要填充的列表
     * @param bkpCodeExtractor 获取bkpCode的函数
     * @param localNameSetter 设置本地公司名称的函数
     * @param enNameSetter 设置英文公司名称的函数
     * @param <T> 列表元素类型
     *
     *           List<MyClass> myList = getMyList();
     *
     * customerRpcService.fillCompanyNameByBkpCodeFunctionally(
     *     myList,
     *     MyClass::getBkpCode,           // 提取bkpCode的函数
     *     MyClass::setCompanyNameLocal,  // 设置本地名称的函数
     *     MyClass::setCompanyNameEn      // 设置英文名称的函数
     * );
     */
    <T> void fillCompanyNameByBkpCodeFunctionally(List<T> list,
                                                  java.util.function.Function<T, String> bkpCodeExtractor,
                                                  java.util.function.BiConsumer<T, String> localNameSetter,
                                                  java.util.function.BiConsumer<T, String> enNameSetter);

    /**
     * 使用函数式编程方式根据三字码填充公司名称
     * @param list 需要填充的列表
     * @param partnerCodeExtractor 获取partnerCodeExtractor的函数
     * @param localNameSetter 设置本地公司名称的函数
     * @param enNameSetter 设置英文公司名称的函数
     * @param <T> 列表元素类型
     *
     *           List<MyClass> myList = getMyList();
     *
     * customerRpcService.fillCompanyNameByPartnerCodeFunctionally(
     *     myList,
     *     MyClass::getPartnerCode,           // 提取partnerCodeExtractor的函数
     *     MyClass::setCompanyNameLocal,  // 设置本地名称的函数
     *     MyClass::setCompanyNameEn      // 设置英文名称的函数
     * );
     */
    <T> void fillCompanyNameByPartnerCodeFunctionally(List<T> list,
                                                  java.util.function.Function<T, String> partnerCodeExtractor,
                                                  java.util.function.BiConsumer<T, String> localNameSetter,
                                                  java.util.function.BiConsumer<T, String> enNameSetter);

    /**
     * 填充冗余字段:name
     *
     * @param list
     */
    void fillAgentName(List<? extends AgentNameBaseVo> list);

    /**
     * 填充冗余字段:vesselName
     * 
     * @param list
     */
    void fillVesselName(List<VesselOffHireMaintenanceRespVO> list);

    /**
     * 客商英文名称
     *
     * @param code 客商编码
     * @return 客商英文名称
     */
    String getCompanyNameEn(String code);

    /**
     * 客商英文名称
     *
     * @param codeList 客商编码列表
     * @return 客商英文名称
     */
    Map<String, String> getCompanyNameMap(List<String> codeList);

    /**
     * 客商本地名称
     *
     * @param codeList 客商编码列表
     * @return 客商英文名称
     */
    Map<String, String> getCompanyLocalNameMap(List<String> codeList);

    /**
     * 客商英文名称
     *
     * @param codeList 客商编码列表
     * @return 客商英文名称
     */
    Map<String, CompanyNameCastRespDTO> getCompanyMap(List<String> codeList);

    /**
     * 客商返回的原始数据
     *
     * @param companyNameCastReqVO
     * @return  List<CustomerInfoRespDTO>
     */
    List<CompanyNameCastRespDTO> customerFromCodeList(CompanyNameCastReqVO companyNameCastReqVO);
}
